﻿#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <assert.h>
using namespace std;
#include "RBTree.h"
#include "Myset.h"
#include "Mymap.h"

//void test1()
//{
//	RBTree<int, int> rbt1;
//	rbt1.Insert(make_pair(1, 1));
//	rbt1.Insert(make_pair(2, 2));
//	rbt1.Insert(make_pair(3, 3));
//	rbt1.Insert(make_pair(4, 4));
//	rbt1.Print();
//	cout << rbt1.Find(1) << endl;
//	cout << rbt1.IsBalance() << endl;
//
//}
//
////用随机值测试, 样例更全面
//void test2()
//{
//	const size_t N = 1000000;//个数
//	//1.生成N个随机数放在vector
//	time_t t = time(nullptr);//产生时间戳    或//time_t t = time(0);    //time_t 是int/long(int)/long long
//	srand((unsigned int)t);//用一个时间戳通过一些算法产生一个种子, 种子会自动传给rand(),  相同的种子产生相同的一批随机数(3万多)
//
//	//vector<int> v1 = { 4, 2, 6, 1, 3, 5, 15, 7, 16, 14, 8, 3, 1, 10, 6, 4, 7, 14, 13, 14,66,77, 35,74 };
//	vector<int> v1;
//	v1.reserve(N);//预开辟空间
//	for (int i = 0; i < N; ++i)
//	{
//		int rd = rand();//随机数
//		//cout << rd + i << ' ';
//		v1.push_back((rd + i));//+i更随机, 随机数更多;   例如: 产生两个相同的rd时, i不同, 最终插入的也是两个不同的数
//	}
//
//	//vector<int> v2({ 4, 2, 6, 1,3, 5, 15, 7, 16, 14 });
//
//	RBTree<int, int> rb1;
//	int i = 0;
//
//	//2.计算插入效率
//	size_t start1 = clock();//返回从程序运行到调用当前clock所经过的时间
//	for (auto& e : v1)
//	{
//		//printf("Insert: <%2d, %2d>\n", e, e);
//		rb1.Insert({ e,e });//隐式类型转换initializer_list --> pair<int, int>
//		i++;
//	}
//	size_t end1 = clock();
//
//	//3.计算查询效率
//	size_t start2 = clock();
//	//查找确定的值
//	for (auto& e : v1)
//	{
//		rb1.Find(e);
//	}
//	////随机查找
//	//for (int i = 0; i < N; ++i)
//	//{
//	//	rb1.Find(rand() + i);
//	//}
//	size_t end2 = clock();
//
//	//4.计算判断平衡的效率
//	size_t start3 = clock();
//	cout << endl <<  "IsBalance " << rb1.IsBalance() << endl;
//	size_t end3 = clock();
//
//	//5.打印
//	size_t start4 = clock();
//	//rb1.PrintRBTree();
//	size_t end4 = clock();
//
//	printf("插入:%zd\n查询:%zd\n判断平衡:%zd\n打印:%zd\n", end1 - start1, end2 - start2, end3 - start3, end4 - start4);
//	cout << "节点个数: " << rb1.Size() << endl;
//}

//void test3()
//{
//	RBTree<int,int, int&, int*> rbt1;
//	rbt1.Insert({ 1, 1 });
//	RBTree<int, int, int&, int*>::Iterator it1 = rbt1.begin();
//
//}

/***************************************************************************************************************************/

void test4()
{
	Myset<int> set1;
	set1.insert(1);
	set1.insert(2);
	set1.insert(3);
	set1.insert(4);
	set1.insert(5);
	Myset<int>::iterator it1 = set1.begin();
	//while (it1 != set1.end())
	//{
	//	cout << *it1 << ' ';
	//	++it1;
	//}
	for (auto& e : set1)
	{
		cout << e << ' ';
	}
	cout << endl;

	Mymap<int, int> map1;
	map1.insert(make_pair(1, 1));
	map1.insert(make_pair(2, 2));
	map1.insert(make_pair(3, 3));
	map1.insert(make_pair(4, 4));
	map1.insert(make_pair(5, 5));
	for (auto& [x,y] : map1)
	{
		printf("(%d, %d)  ", x, y);
	}

	Mymap<int, int> map2(map1);
}

void test5()
{
	string arr[] = { "1", "1", "2", "2", "3", "3", "4","4", "1", "4", "3","6","1", "1","1" };
	Mymap<string, int> countMap;
	for (auto& e : arr)
	{
		++countMap[e];
	}

	for (auto& kv : countMap)
	{
		cout << kv.first << ":" << kv.second << endl;
	}
	cout << endl;
}

void test6()
{
	Myset<int> set1;
	cout << set1._t.IsBalance() << endl;
}

int main()
{
	//test4();
	//test5();
	test6();

	return 0;
}